import { defineConfig } from '@tsslint/config';
import { defineRules } from '@tsslint/eslint';

export default defineConfig({
	rules: await defineRules({
		// oxlint's default rules, but without unicorn. See https://oxc.rs/docs/guide/usage/linter/rules.html
		'for-direction': true,
		'no-async-promise-executor': true,
		'no-caller': true,
		'no-class-assign': true,
		'no-compare-neg-zero': true,
		'no-cond-assign': true,
		'no-const-assign': true,
		'no-constant-binary-expression': true,
		'no-constant-condition': true,
		'no-control-regex': true,
		'no-debugger': true,
		'no-delete-var': true,
		'no-dupe-class-members': true,
		'no-dupe-else-if': true,
		'no-dupe-keys': true,
		'no-duplicate-case': true,
		'no-empty-character-class': true,
		'no-empty-pattern': true,
		'no-empty-static-block': true,
		// 'no-eval': true,
		'no-ex-assign': true,
		'no-extra-boolean-cast': true,
		'no-func-assign': true,
		'no-global-assign': true,
		'no-import-assign': true,
		'no-invalid-regexp': true,
		'no-irregular-whitespace': true,
		'no-loss-of-precision': true,
		'no-new-native-nonconstructor': true,
		'no-nonoctal-decimal-escape': true,
		'no-obj-calls': true,
		'no-self-assign': true,
		'no-setter-return': true,
		'no-shadow-restricted-names': true,
		'no-sparse-arrays': true,
		'no-this-before-super': true,
		'no-unassigned-vars': true,
		'no-unsafe-finally': true,
		'no-unsafe-negation': true,
		'no-unsafe-optional-chaining': true,
		'no-unused-labels': true,
		'no-unused-private-class-members': true,
		// 'no-unused-vars': true,
		'no-useless-backreference': true,
		'no-useless-catch': true,
		// 'no-useless-escape': true,
		'no-useless-rename': true,
		'no-with': true,
		'require-yield': true,
		'use-isnan': true,
		'valid-typeof': true,
		'@typescript-eslint/await-thenable': true,
		'@typescript-eslint/no-array-delete': true,
		'@typescript-eslint/no-base-to-string': true,
		// '@typescript-eslint/no-confusing-void-expression': true,
		'@typescript-eslint/no-duplicate-enum-values': true,
		'@typescript-eslint/no-duplicate-type-constituents': true,
		'@typescript-eslint/no-extra-non-null-assertion': true,
		// '@typescript-eslint/no-floating-promises': true,
		'@typescript-eslint/no-for-in-array': true,
		'@typescript-eslint/no-implied-eval': true,
		'@typescript-eslint/no-meaningless-void-operator': true,
		'@typescript-eslint/no-misused-new': true,
		'@typescript-eslint/no-misused-spread': true,
		'@typescript-eslint/no-non-null-asserted-optional-chain': true,
		// '@typescript-eslint/no-redundant-type-constituents': true,
		'@typescript-eslint/no-this-alias': true,
		'@typescript-eslint/no-unnecessary-parameter-property-assignment': true,
		'@typescript-eslint/no-unsafe-declaration-merging': true,
		'@typescript-eslint/no-unsafe-unary-minus': true,
		'@typescript-eslint/no-useless-empty-export': true,
		'@typescript-eslint/no-wrapper-object-types': true,
		'@typescript-eslint/prefer-as-const': true,
		'@typescript-eslint/require-array-sort-compare': true,
		'@typescript-eslint/restrict-template-expressions': true,
		'@typescript-eslint/triple-slash-reference': true,
		// '@typescript-eslint/unbound-method': true,

		// Project-specific rules
		'curly': true,
		'eqeqeq': true,
		'no-unused-expressions': true,
		'require-await': true,
		'@typescript-eslint/consistent-type-imports': [{
			disallowTypeAnnotations: false,
			fixStyle: 'inline-type-imports',
		}],
		'@typescript-eslint/no-unnecessary-type-assertion': true,
	}),
});
